from kb import KMKKeyboard

from kmk.keys import KC
from kmk.modules.holdtap import HoldTap
from kmk.modules.layers import Layers

keyboard = KMKKeyboard()

keyboard.modules.append(Layers())

holdtap = HoldTap()
keyboard.modules.append(holdtap)


NONE = KC.NO
QWERTY = KC.MO(0)
LOWER = KC.MO(1)
RAISE = KC.MO(2)
ADJUST = KC.MO(3)
CAE = KC.LCTL(KC.LALT(KC.END))
CAD = KC.LCTL(KC.LALT(KC.DEL))


ZSFT = KC.HT(KC.Z, KC.LSFT, prefer_hold=True, tap_interrupted=False, tap_time=3000)
SLSHSFT = KC.HT(
    KC.SLSH, KC.LSFT, prefer_hold=True, tap_interrupted=False, tap_time=3000
)
ALCTL = KC.HT(KC.A, KC.LCTRL, prefer_hold=False, tap_interrupted=False, tap_time=150)

# fmt:off
keyboard.keymap = [
    [  # QWERTY
     KC.Q,  KC.W,  KC.E,     KC.R,    KC.T,     KC.Y,    KC.U,     KC.I,    KC.O,   KC.P,
     ALCTL, KC.S,  KC.D,     KC.F,    KC.G,     KC.H,    KC.J,     KC.K,    KC.L,   KC.QUOT,
     ZSFT,  KC.X,  KC.C,     KC.V,    KC.B,     KC.N,    KC.M,     KC.COMM, KC.DOT, SLSHSFT,
     NONE, NONE,   KC.LCTL,  LOWER,   KC.SPACE, KC.BSPC, RAISE, KC.RALT,    NONE,  NONE,

     ],
    [  # LOWER
     KC.N1,  KC.N2,  KC.N3,     KC.N4,    KC.N5,     KC.N6,    KC.N7,     KC.N8,    KC.N9,   KC.N0,
     KC.TAB,  KC.LEFT,  KC.DOWN,     KC.UP,    KC.RIGHT,     KC.TRNS,    KC.MINUS,     KC.EQUAL,    KC.LBRC,   KC.RBRC,
     KC.LCTL,  KC.GRAVE,  KC.LGUI,     KC.LALT,    KC.TRNS,     KC.TRNS,    KC.TRNS,     KC.TRNS, 	KC.BSLS, KC.SCLN,
     KC.NO, KC.NO, KC.TRNS,     KC.TRNS,    KC.TRNS, KC.ENTER, ADJUST,     KC.TRNS,    KC.NO,  KC.NO,

     ],
    [  # RAISE
     KC.EXLM,  KC.AT,  KC.HASH,     KC.DLR,    KC.PERC,     KC.CIRC,    KC.AMPR,     KC.ASTR,    KC.LPRN,   KC.RPRN,
     KC.ESC,  KC.TRNS,  KC.TRNS,     KC.TRNS,    KC.TRNS,     KC.TRNS,    KC.UNDS,     KC.PLUS,    KC.LCBR,   KC.RCBR,
     KC.CAPS,  KC.TILDE,  KC.TRNS,     KC.TRNS,    KC.TRNS,     KC.TRNS,    KC.TRNS,     KC.TRNS, KC.PIPE, KC.COLN,
     KC.NO, KC.NO, KC.TRNS,     ADJUST,    KC.TRNS, KC.ENTER, KC.TRNS,     KC.DEL,    KC.NO,  KC.NO,

     ],
     [  # ADJUST
     KC.F1,  KC.F2,  KC.F3,     KC.F4,    KC.F5,     KC.F6,    KC.F7,     KC.F8,    KC.F9,   KC.F10,
     KC.F11,  KC.F12,  KC.TRNS,     KC.TRNS,    KC.TRNS,     KC.TRNS,    KC.TRNS,     CAE,    CAD,   CAD,
     KC.TRNS,  KC.TRNS,  KC.TRNS,     KC.TRNS,    KC.TRNS,     KC.TRNS,    KC.TRNS,     KC.TRNS, KC.TRNS, KC.TRNS,
     KC.NO, KC.NO, KC.TRNS,     KC.TRNS,    KC.TRNS, KC.ENTER, KC.TRNS,     KC.TRNS,    KC.NO,  KC.NO,

     ]
]
# fmt:on

# Uncomment for Trackball
# from kmk.modules.pimoroni_trackball import Trackball, TrackballMode
# import busio as io

# i2c1 = io.I2C(scl=board.GP3, sda=board.GP2)
# trackball = Trackball(i2c1, mode=TrackballMode.MOUSE_MODE)
# keyboard.modules.append(trackball)
# trackball.set_rgbw(255, 255, 255, 30)
# trackball.set_red(20)
# trackball.set_green(100)
# trackball.set_blue(100)
# trackball.set_white(40)

# uncomment for Encoders
# from kmk.modules.encoder import EncoderHandler
# encoder_handler = EncoderHandler()
# keyboard.modules = [encoder_handler]
# encoder_handler.pins = ((board.GP12, board.GP13, None, False), (board.GP27, board.GP26, None, False),)

# encoder_handler.map = [(( KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 1
#                      ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 2
#                      ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 3
#                      ((KC.VOLD, KC.VOLU),(KC.VOLD, KC.VOLU),), # Layer 4
#                      ]

if __name__ == '__main__':
    keyboard.go()
